package com.sx.utils;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class CookieUtils {
    /**
     * 添加或更新指定名称的Cookie
     *
     * @param cookieName Cookie的名称，用于标识特定的Cookie
     * @param time Cookie的存活时间，以秒为单位
     * @param request HTTP请求对象，用于获取请求上下文路径
     * @param response HTTP响应对象，用于向客户端添加Cookie
     * @param stuCode 学生代码，作为Cookie值的一部分
     * @param password 密码，作为Cookie值的一部分
     */
    public static void addCookie(String cookieName, int time,
                                 HttpServletRequest request, HttpServletResponse response,
                                 String stuCode, String password) {
        // 尝试根据Cookie名称获取已存在的Cookie
        Cookie cookie = getCookieByCookieName(cookieName, request);

        if (cookie != null) { // 如果cookie已经存在
            // 更新Cookie的值为学生代码和密码的组合
            cookie.setValue(stuCode + "#" + password);
        } else {
            // 如果Cookie不存在，创建一个新的Cookie并设置学生代码和密码的组合
            cookie = new Cookie(cookieName, stuCode + "#" + password);
        }

        // 设置Cookie的存活时间
        cookie.setMaxAge(time);
        // 设置Cookie的作用路径，通常为应用的上下文路径
        cookie.setPath(request.getContextPath());

        // 将Cookie添加到HTTP响应中，使其返回给浏览器
        response.addCookie(cookie);
    }

    /**
     * 根据cookie名称获取cookie对象
     *
     * @param cookieName 需要获取的cookie名称
     * @param request HTTP请求对象，用于获取请求中的cookie信息
     * @return 如果找到匹配名称的cookie，则返回该cookie对象；否则返回null
     */
    public static Cookie getCookieByCookieName(String cookieName, HttpServletRequest request) {
        // 获取请求中的所有cookie
        Cookie[] cookies = request.getCookies();

        // 检查cookie数组是否非空
        if (cookies != null) {
            // 遍历所有cookie，寻找匹配名称的cookie
            for (Cookie cookie : cookies) {
                // 如果找到匹配名称的cookie，则返回该cookie对象
                if (cookie.getName().equals(cookieName)) {
                    return cookie;
                }
            }
        }
        // 如果未找到匹配名称的cookie，则返回null
        return null;
    }
}
